'use strict';
const { Controller } = require('egg');

class UploadController extends Controller {
  /**
   * 腾讯cos上传
   */
  async cos() {
    const ctx = this.ctx;
    const that = this
    try {
      // 获取上传的文件
      const file = await ctx.getFileStream();

      // 获取文件类型和原始文件名
      const fileType = file.mimeType || ''; // 文件MIME类型
      const originalFilename = file.filename; // 原始文件名

      // 生成唯一文件名，确保不重复
      const timestamp = Date.now();
      const randomString = Math.random().toString(36).substring(2, 10);
      const fileExtension = originalFilename.includes('.') ?
          originalFilename.substring(originalFilename.lastIndexOf('.')) : '';
      const newFilename = `${timestamp}_${randomString}${fileExtension}`;

      // 使用Promise包装流处理过程
      const processFileStream = () => {
        return new Promise((resolve, reject) => {
          let fileSize = 0;
          const chunks = [];

          // 监听数据块事件来计算文件大小
          file.on('data', chunk => {
            fileSize += chunk.length;
            chunks.push(chunk);
          });

          file.on('end', async () => {
            try {
              // 将数据块组合成完整的Buffer
              const buffer = Buffer.concat(chunks);
              const result = await this.ctx.service.common.upload.uploadCos(buffer, newFilename)

              // 上传成功，更新文件记录的URL
              const fileUrl = 'https://' + result.Location;

              // 先在文件表中插入记录
              let fileRecord = await ctx.model.Common.File.create({
                file_name: newFilename,
                file_origin_name: originalFilename,
                file_size: fileSize,
                file_type: fileType,
                file_url: fileUrl
              });
              // 返回成功结果
              resolve({
                id: fileRecord.id,
                url: fileUrl,
                name: newFilename,
                originalName: originalFilename,
                size: fileSize,
                type: fileType
              });
            } catch (err) {
              reject(err);
            }
          });

          file.on('error', err => {
            console.error('文件流读取错误:', err);
            reject(err);
          });
        });
      };

      // 处理文件流并获取结果
      const result = await processFileStream();

      // 返回成功响应
      ctx.success(result);

    } catch (error) {
      // 记录错误信息
      console.error('文件上传失败:', error);
      // 返回错误响应
      ctx.error('文件上传失败: ' + (error.message || '未知错误'));
    }
  }
}

module.exports = UploadController;

